#include <stdio.h>
/*
    此队列的一些约定:
    1. 队列存储使用 连续空间存储，也就是顺序队列而非链链式队列
    2. 队列可以循环存取元素，可以理解为需要实现循环队列
    3. 队列头指针指向队头元素，队列尾指针指向队尾元素的后一个元素，
    4. 不要忘记，队列空出一个位置不能放元素，这样才能方便判断队空与队满的情况(当然你可以有自己的实现方式，不遵循此约定也行，但是必须遵循下面函数的接口说明)
*/

typedef int DYMQueueDataType;

struct _queue
{
    DYMQueueDataType* buff;
    int rear;       // 队尾指针
    int front;      // 队首指针
    int capacity;   // 队列最大容量
    int size;       // 队列已有元素数量
};

typedef struct  _queue DYMQueue;

/*  函数功能：创建一个队列
    @param capacity : 队列最大容量
    @return : 返回创建后的队列
 */
DYMQueue DYMQueueCreate(size_t capacity);

/*
    函数功能：元素进队
    @param queue：待操作队列
    @param elem: 待进队元素
    @return：返回操作结果，1：进队成功，0：队列已满（或传入参数 queue 为空、或队列 buffer 为空），进队失败 
*/
int DYMQueuePush(DYMQueue *queue,DYMQueueDataType elem);

/*
    函数功能：元素出队
    @param queue：待操作队列
    @return：返回操作结果，1：出队成功，0：队列已空（或传入参数 queue 为空、或队列 buffer 为空），出队失败 
*/
int DYMQueuePop(DYMQueue *queue);

/*
    函数功能：获取队首元素，不执行出队操作
    @param queue：待操作队列
    @param elem: 队首元素将填入这个地址 
    @return：返回操作结果，1：获取成功，0：队列为空（或传入参数 queue 为空、或队列 buffer 为空），获取失败 
*/
int DYMQueueTop(DYMQueue *queue,DYMQueueDataType *elem);

/*
    函数功能：销毁队列
    @param queue：待销毁队列
*/
void DYMQueueDestory(DYMQueue *queue);